﻿
 // Простая и эффективная проверка на наличие возврата из функции.
 // Чаще всего возврат просто забывают написать.
 // Нет никакого смысла разбирать сложные случаи,
 // когда пропущен возврат в одной из логических ветвей,
 // так как такие ошибки встречаются редко.
 // Гораздо проще договориться с командой, что функция всегда
 // должна оканчиваться инструкцией Возврат и автоматически
 // проверять код подобным плагином.

Перем Типы;
Перем ТаблицаТокенов;
Перем ТаблицаОшибок;

Процедура Открыть(Парсер, Параметры) Экспорт
	Типы = Парсер.Типы();
	ТаблицаТокенов = Парсер.ТаблицаТокенов();
	ТаблицаОшибок = Парсер.ТаблицаОшибок();
КонецПроцедуры

Функция Закрыть() Экспорт
	Возврат Неопределено;
КонецФункции

Функция Подписки() Экспорт
	Перем Подписки;
	Подписки = Новый Массив;
	Подписки.Добавить("ПосетитьОбъявлениеМетода");
	Возврат Подписки;
КонецФункции

Процедура ПосетитьОбъявлениеМетода(ОбъявлениеМетода) Экспорт
	Перем КоличествоОператоров;
	Если ОбъявлениеМетода.Сигнатура.Тип <> Типы.ОбъявлениеСигнатурыФункции Тогда
		Возврат;
	КонецЕсли;
	КоличествоОператоров = ОбъявлениеМетода.Операторы.Количество();
	Если КоличествоОператоров = 0 Или ОбъявлениеМетода.Операторы[КоличествоОператоров - 1].Тип <> Типы.ОператорВозврат Тогда
		Текст = СтрШаблон("Последней инструкцией функции `%1()` должен быть `Возврат`""", ОбъявлениеМетода.Сигнатура.Имя);
		Ошибка(Текст, ОбъявлениеМетода.Конец);
	КонецЕсли;
КонецПроцедуры

Процедура Ошибка(Текст, Начало, Конец = Неопределено, ЕстьЗамена = Ложь)
	Ошибка = ТаблицаОшибок.Добавить();
	Ошибка.Источник = "ДетекторФункцийБезВозвратаВКонце";
	Ошибка.Текст = Текст;
	Ошибка.ПозицияНачала = Начало.Позиция;
	Ошибка.НомерСтрокиНачала = Начало.НомерСтроки;
	Ошибка.НомерКолонкиНачала = Начало.НомерКолонки;
	Если Конец = Неопределено Или Конец = Начало Тогда
		Ошибка.ПозицияКонца = Начало.Позиция + Начало.Длина;
		Ошибка.НомерСтрокиКонца = Начало.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Начало.НомерКолонки + Начало.Длина;
	Иначе
		Ошибка.ПозицияКонца = Конец.Позиция + Конец.Длина;
		Ошибка.НомерСтрокиКонца = Конец.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Конец.НомерКолонки + Конец.Длина;
	КонецЕсли;
	Ошибка.ЕстьЗамена = ЕстьЗамена;
КонецПроцедуры